import redis from 'redis';
import { redisRuntimeLogger } from './log4js';

var client = redis.createClient(6379,'127.0.0.1');

client.on('error',function (err) {
  redisRuntimeLogger.error('redis error：'+err);
  try{
    //重新打开 redis
    const exec = require('child_process').exec
    const build = exec("redis-server")
    redisRuntimeLogger.info("redis reconnected!")
    build.stdout.on('data', data => console.log('stdout: ', data))
  }catch(e){
    redisRuntimeLogger.error(e)
  }
});

client.on('connect', function () {
  redisRuntimeLogger.info('redis连接成功...')
});

/**
 *
 * @param dbNum 库号
 * @param key 键
 * @param value 值
 * @param expire 过期时间（单位：秒，可为空，为空则不过期）
 * @param callback 回调
 */
export function set(dbNum, key, value, expire) {
  return new Promise((resolve, reject) => {
    client.select(dbNum,function (err) {
      if (err){
          redisRuntimeLogger.error('redis set 选库失败：'+err);
      }else {
          client.set(key,value,function (err,result) {
              if (err){
                  redisRuntimeLogger.error('redis插入失败：'+err);
                  reject(err);
                  return
              }
              if (!isNaN(expire) && expire>0){
                  client.expire(key, parseInt(expire));
              }
              resolve(result);
          })
      }
    })
  })
}

/**
 *
 * @param dbNum 库号
 * @param key 键
 */
export async function get(dbNum, key) {
  return new Promise((resolve, reject) => {
    client.select(dbNum,function (err) {
      if (err){
          redisRuntimeLogger.error('redis get 选库失败：'+err);
      }else {
          client.get(key,function (err,result) {
              if (err) {
                redisRuntimeLogger.error('redis获取失败：'+err);
                reject(err)
                return
              }else if (!result){
                resolve(null)
              }
              resolve(result)
          })
      }
    })
  })
}

/**
 * 判断key是否存在
 * @param dbNum 库号
 * @param key 键
 */
export async function exists(dbNum, key){
  return new Promise((resolve, reject) => {
    client.select(dbNum, function(err) {
      if (err) {
        redisRuntimeLogger.error('redis get 选库失败：'+err);
      } else {
        client.exists(key, function (err, result) {
          if(err){
            redisRuntimeLogger.error('redis查找失败：'+err);
            reject(err)
            return
          }else{
            if(result === 1){
              resolve(true)
            }else{
              resolve(false)
            }
          }
        })
      }
    })
  })
}

/**
 * 
 * @param dbNum 库号
 * @param key 键
 */
export async function del(dbNum, key){
  return new Promise((resolve, reject) => {
    client.select(dbNum, function(err) {
      if (err) {
        redisRuntimeLogger.error('redis get 选库失败：'+err);
      } else {
        client.del(key, function (err, result) {
          if(err){
            redisRuntimeLogger.error('redis删除失败：'+err);
            reject(err)
            return
          }else{
            if(result === 1){
              resolve(true)
            }else{
              redisRuntimeLogger.info('删除失败,key不存在！')
              resolve(true)
            }
          }
        })
      }
    })
  })
}